package org.jsola.hr.provider;

import com.alibaba.fastjson.JSONObject;
import org.jsola.approval.dto.IssuedApproFlowAddDTO;
import org.jsola.approval.dto.NewApproDTO;
import org.jsola.approval.dto.UserApproAddDTO;
import org.jsola.approval.entity.ApproFlowNode;
import org.jsola.approval.query.UserFlowApproQuery;
import org.jsola.approval.vo.*;
import org.jsola.hr.vo.EmpAndApproInfoVO;
import org.jsola.hr.vo.EmpChangesVO;
import org.jsola.hr.vo.EmpInfoVO;
import org.jsola.user.core.TokenUser;

import java.util.List;

/**
 * @author zxy
 */
public interface IApproProviderService {

    /**
     * 初始化一些通用审批
     *
     * @param tokenUser 当前用户
     */
    void initApproval(String companyId, TokenUser tokenUser);

    /**
     * 获取某公司入职可用的的所有审批流程
     *
     * @param companyId 公司id
     * @param tokenUser 当前用户
     * @return 审批流程list
     */
    List<ApproFlowListVO> listOnJobCanUseFlowsByCompany(String companyId, TokenUser tokenUser);

    /**
     * 获取某公司离职可用的的所有审批流程
     *
     * @param companyId 公司id
     * @param tokenUser 当前用户
     * @return 审批流程list
     */
    List<ApproFlowListVO> listLeavingCanUseFlowsByCompany(String companyId, TokenUser tokenUser);

    /**
     * 获取某公司调岗可用的的所有审批流程
     *
     * @param companyId 公司idbbb
     * @param tokenUser 当前用户
     * @return 审批流程list
     */
    List<ApproFlowListVO> listTransferDutyCanUseFlowsByCompany(String companyId, TokenUser tokenUser);

    /**
     * 获取某公司转正可用的的所有审批流程
     *
     * @param companyId 公司id
     * @param tokenUser 当前用户
     * @return 审批流程list
     */
    List<ApproFlowListVO> listTurnStraightCanUseFlowsByCompany(String companyId, TokenUser tokenUser);

    /**
     * 获取某公司报销可用的的所有审批流程
     *
     * @param companyId 公司id
     * @param tokenUser 当前用户
     * @return 审批流程list
     */
    List<ApproFlowListVO> listReimbursementCanUseFlowsByCompany(String companyId, TokenUser tokenUser);

    /**
     * 获取某公司请假可用的的所有审批流程
     *
     * @param companyId 公司id
     * @param tokenUser 当前用户
     * @return 审批流程list
     */
    List<ApproFlowListVO> listLeaveCanUseFlowsByCompany(String companyId, TokenUser tokenUser);


    /**
     * 发起入职审批
     *
     * @param empInfoVO   员工信息
     * @param approFlowId 入职审批流程id
     * @param tokenUser   当前用户
     */
    UserApproVO createOnJobAppro(EmpInfoVO empInfoVO, String approFlowId, TokenUser tokenUser);


    /**
     * 发起转正审批
     *
     * @param empInfoVO    员工信息
     * @param empChangesVO 变更信息
     * @param approFlowId  入职审批流程id
     * @param tokenUser    当前用户
     */
    UserApproVO createTurnStraightAppro(EmpInfoVO empInfoVO, EmpChangesVO empChangesVO, String approFlowId, TokenUser tokenUser);


    /**
     * 发起调岗审批
     *
     * @param empInfoVO    员工信息
     * @param empChangesVO 变更信息
     * @param approFlowId  入职审批流程id
     * @param tokenUser    当前用户
     */
    UserApproVO createTransferDutyAppro(EmpInfoVO empInfoVO, EmpChangesVO empChangesVO, String approFlowId, TokenUser tokenUser);


    /**
     * 发起离职审批
     *
     * @param empInfoVO    员工信息
     * @param empChangesVO 变更信息
     * @param approFlowId  入职审批流程id
     * @param tokenUser    当前用户
     */
    UserApproVO createLeavingAppro(EmpInfoVO empInfoVO, EmpChangesVO empChangesVO, String approFlowId, TokenUser tokenUser);


    /**
     * 根据表单唯一标识获取用户所填信息
     *
     * @param userApproId         用户发起的审批id
     * @param approFlowFormFormId 审批流程表单唯一标识(formId)
     * @param siteId              站点
     * @return 用户所填信息
     */
    UserApproInfoVO selectUserApproInfoByFormId(String userApproId, String approFlowFormFormId, String siteId);

    /**
     * 根据用户审批申请id获取审批相关信息
     *
     * @param userApproId 用户审批申请id
     * @param tokenUser   当前用户
     * @return 审批相关信息
     */
    UserApproAllInfoVO findUserApproDetailsById(String userApproId, TokenUser tokenUser);

    /**
     * 根据业务类型业务id获取员工审批详情
     *
     * @param subjectType 业务类型
     * @param subjectId   业务id
     * @param tokenUser   当前用户
     * @return 员工审批详情
     */
    EmpAndApproInfoVO findEmpApproDetailsBySubject(String subjectType, String subjectId, TokenUser tokenUser);

    /**
     * 根据用户填写的信息获取匹配的流程
     *
     * @param userApproAddDTO 审批流程
     * @param tokenUser       当前用户
     */
    List<ApproFlowNode> getFlowProcessByApproInfo(UserApproAddDTO userApproAddDTO, TokenUser tokenUser);

    /**
     * 获取某种审批类型可用的的所有审批流程
     *
     * @param moduleType 子系统
     * @param type       审批类型
     * @param tokenUser  当前用户
     * @return 审批流程list
     */
    List<ApproFlowListVO> listCanUseFlowsByType(String moduleType, String type, TokenUser tokenUser);

    /**
     * 获取审批流程id
     *
     * @param type      审批类型
     * @param tokenUser 当前用户
     * @return 审批流程id
     */
    String getFlowId(String type, TokenUser tokenUser);

    /**
     * 根据用工单位id获取审批流程id
     *
     * @param type      审批类型
     * @param companyId 用工单位id
     * @param tokenUser 当前用户
     * @return 审批流程id
     */
    String getFlowIdByCompanyId(String type, String companyId, TokenUser tokenUser);

    /**
     * 校验用工单位是否有指定的审批流程
     *
     * @param type           审批类型
     * @param companyId      用工单位id
     * @param flowTemplateId 审批模板id
     * @param tokenUser      当前用户
     * @return boolean
     */
    boolean checkFlowId(String type, String companyId, String flowTemplateId, TokenUser tokenUser);

    /**
     * 用户新增审批
     *
     * @param newApproDTO 审批信息
     * @param tokenUser   当前用户
     * @return 审批信息
     */
    UserApproVO addUserAppro(NewApproDTO newApproDTO, TokenUser tokenUser);

    /**
     * 根据业务id查询审批
     *
     * @param subjectType 业务类型code
     * @param subjectId   业务id
     * @param tokenUser   当前用户
     * @return 审批信息
     */
    List<UserApproListVO> listBySubject(String subjectType, String subjectId, TokenUser tokenUser);

    /**
     * 根据业务id查询最新的审批
     *
     * @param subjectType 业务类型code
     * @param subjectId   业务id
     * @param tokenUser   当前用户
     * @return 审批信息
     */
    UserApproListVO selectLastBySubject(String subjectType, String subjectId, TokenUser tokenUser);

    /**
     * 发布流程(包含流程,表单,流程进程等)
     *
     * @param flowInfo  流程信息,包含流程信息/流程表单/流程节点等信息
     * @param tokenUser 当前用户
     * @return 保存后的流程
     */
    JSONObject publishFlow(String flowInfo, TokenUser tokenUser);

    /**
     * 查询用工单位指定类型的审批流程
     *
     * @param companyId 用工单位id
     * @param type      审批类型code
     * @param siteId    所属站点id
     * @return 审批流程表列表信息
     */
    List<ApproFlowListVO> selectByCompanyId(String companyId, String type, String siteId);


    /**
     * 下发审批到公司
     *
     * @param issuedApproFlowAddDTO 下发审批到公司
     * @param tokenUser             当前用户
     * @return 保存结果
     */
    List<ApproFlowVO> saveIssuedApproFlow(IssuedApproFlowAddDTO issuedApproFlowAddDTO, TokenUser tokenUser);

    /**
     * 获取公司下所有审批流程
     *
     * @param companyId 公司id
     * @param siteId    当前用户站点
     * @return 审批流程list
     */
    List<ApproFlowListVO> selectAllFlowsByCompany(String companyId, String siteId);

    /**
     * 查询由我审批的待处理的用户审批申请
     *
     * @param userFlowApproQuery 查询条件
     * @param tokenUser          当前用户
     * @return 由我审批的用户审批申请
     */
    List<UserApproNodeInfoVO> listUserApprovesWaitApproveByMe(UserFlowApproQuery userFlowApproQuery, TokenUser tokenUser);

    /**
     * 查询由我审批的已处理的用户审批申请(已通过+已驳回)
     *
     * @param userFlowApproQuery 查询条件
     * @param tokenUser          当前用户
     * @return 由我审批的用户审批申请
     */
    List<UserApproNodeInfoVO> listUserApprovesFinishedApproveByMe(UserFlowApproQuery userFlowApproQuery, TokenUser tokenUser);

    /**
     * 查询由我审批的已通过的用户审批申请
     *
     * @param userFlowApproQuery 查询条件
     * @param tokenUser          当前用户
     * @return 由我审批的用户审批申请
     */
    List<UserApproNodeInfoVO> listUserPassedApprovesApproveByMe(UserFlowApproQuery userFlowApproQuery, TokenUser tokenUser);

    /**
     * 查询由我审批的已驳回的用户审批申请（我驳回或者其他人驳回）
     *
     * @param userFlowApproQuery 查询条件
     * @param tokenUser          当前用户
     * @return 由我审批的用户审批申请
     */
    List<UserApproNodeInfoVO> listUserRejectedApprovesApproveByMe(UserFlowApproQuery userFlowApproQuery, TokenUser tokenUser);

    /**
     * 查询已通过的用户审批申请
     *
     * @param userFlowApproQuery 查询条件
     * @param tokenUser          当前用户
     * @return 已通过的审批
     */
    List<UserApproNodeInfoVO> listPassedApproves(UserFlowApproQuery userFlowApproQuery, TokenUser tokenUser);

    /**
     * 查询已驳回的用户审批申请
     *
     * @param userFlowApproQuery 查询条件
     * @param tokenUser          当前用户
     * @return 已驳回的审批
     */
    List<UserApproNodeInfoVO> listRejectedApproves(UserFlowApproQuery userFlowApproQuery, TokenUser tokenUser);

    /**
     * 根据条件查询由我创建的审批申请
     *
     * @param userFlowApproQuery 查询条件
     * @param tokenUser          当前用户
     * @return 用户审批申请
     */
    List<UserApproListVO> listUserApprosCreateByMe(UserFlowApproQuery userFlowApproQuery, TokenUser tokenUser);

    /**
     * 根据条件查询抄送我的审批申请
     *
     * @param userFlowApproQuery 查询条件
     * @param tokenUser          当前用户
     * @return 用户审批申请
     */
    List<UserApproNodeInfoVO> listUserApprosNotifierMe(UserFlowApproQuery userFlowApproQuery, TokenUser tokenUser);
}
